package com.priox.sigar.jsf;

import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.agrupacion.RegistroAgrupacionApp;
import com.priox.sigar.application.agrupacionAcreedor.RegistroAgrupacionAcreedorApp;
import com.priox.sigar.application.checkpoint.RegistroCheckPointApp;
import com.priox.sigar.application.mappers.*;
import com.priox.sigar.client.dto.*;
import com.priox.sigar.client.flt.AcreedorFlt;
import com.priox.sigar.client.flt.CuentaContableFlt;
import com.priox.sigar.domain.model.Agrupacion;
import com.priox.sigar.domain.model.AgrupacionAcreedor;
import com.priox.sigar.enums.ActivoInactivo;
import com.priox.sigar.enums.TipoCuenta;
import com.priox.sigar.enums.TipoCuentaOperacion;
import com.priox.sigar.enums.TipoSigno;
import com.priox.sigar.jsf.util.FindCrudBeanBase;
import org.primefaces.event.CloseEvent;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;


@ManagedBean
@Scope("session")
@Component
public class MaestroAgrupacionAcreedorJsfBean extends FindCrudBeanBase {

    boolean stateMode;
    AgrupacionAcreedorDTO filtroBusqueda;
    AcreedorFlt filtroPick=new AcreedorFlt();
    AgrupacionAcreedorDTO nuevoRegistro;
    //TasaProvisionDTO nuevaTasaProvision;
    AcreedorDTO nuevoRegistroDetalle;

    List<AgrupacionAcreedorDTO> registros = new ArrayList<AgrupacionAcreedorDTO>();

    List<AcreedorDTO> detalle = new ArrayList<AcreedorDTO>();


    private List<AcreedorDTO> acreedorPickList;
    List<GrupoEmpresarialDTO> cmbGrupoEmpresarial;


    @Autowired
    AgrupacionAcreedorMapper agrupacionAcreedorMapper;

    @Autowired
    AcreedorMapper acreedorMapper;

    @Autowired
    RegistroAgrupacionAcreedorApp registroAgrupacionAcreedorApp;

    @Autowired
    RegistroCheckPointApp registroCheckPointApp;

    @Autowired
    DTOMapperService mapperService;


    @Autowired
    GrupoEmpresarialMapper grupoEmpresarialMapper;

    public List<GrupoEmpresarialDTO> getCmbGrupoEmpresarial() {
        return cmbGrupoEmpresarial;
    }

    public void setCmbGrupoEmpresarial(List<GrupoEmpresarialDTO> cmbGrupoEmpresarial) {
        this.cmbGrupoEmpresarial = cmbGrupoEmpresarial;
    }

    @PostConstruct
    public void init() {
        filtroBusqueda = new AgrupacionAcreedorDTO();
        nuevoRegistro = new AgrupacionAcreedorDTO();
        cmbGrupoEmpresarial = grupoEmpresarialMapper.findAll();
        findRegistros();


    }

    /*Métodos de herencia*/

    @Override
    public void setCursorTableNull() {

    }
                /*
    public void showTasaProvision(ActionEvent actionEvent) {
        nuevoRegistro.buildTasaProvision();
    }
                 */
    public void showNewDialogSeleccion(ActionEvent actionEvent) {
        filtroPick = new AcreedorFlt();
        acreedorPickList = new ArrayList<AcreedorDTO>();
        executeModal("wvSeleccionDialog", true);
    }

    @Override
    public void onShowEditDialog(ActionEvent actionEvent) {
        setUpdateMode(true);
        setPersistMode(true);
        nuevoRegistro = registroAgrupacionAcreedorApp.findById(nuevoRegistro.getAgrupacionAcreedorId());
    }


    public void seleccionar(ActionEvent actionEvent) {

        List<String> seleccionados = new ArrayList<String>();

        for (AcreedorDTO acreedorDTO : acreedorPickList) {
            if (acreedorDTO.isSeleccionado()) {
                seleccionados.add(acreedorDTO.getAcreedorId());
            }
        }
        nuevoRegistro.getAcreedores().addAll(registroAgrupacionAcreedorApp.findByIdList(seleccionados));

        String dialogName = (String) actionEvent.getComponent().getAttributes().get("dialogName");
        if (dialogName != null) {
            executeModal(dialogName, false);
        }
    }

    public void cleanActionSelect(ActionEvent actionEvent) {
        acreedorPickList = new ArrayList<AcreedorDTO>();
        filtroPick = new AcreedorFlt();
    }


    @Override
    public void onNewRecord(ActionEvent actionEvent) {
        setUpdateMode(false);
        nuevoRegistro = new AgrupacionAcreedorDTO();
        nuevoRegistro.setEstado(ActivoInactivo.ACTIVO);
    }

    public void initForm(ActionEvent actionEvent) {


    }

    @Override
    public void onFind(ActionEvent actionEvent) {
        findRegistros();
    }

    public TipoCuentaOperacion[] getAllTipoOperacion() {
        return TipoCuentaOperacion.values();
    }

    public void findActionSelect(ActionEvent actionEvent) {
        List<String> ids = new ArrayList<String>();
        for (AcreedorDTO acreedorDTO : nuevoRegistro.getAcreedores()) {
            ids.add(acreedorDTO.getAcreedorId());
        }
        //filtroPick.setTipoCuenta(nuevoRegistro.getTipo());
        //filtroPick.setNotInCuentaList(ids);
//        filtroPick.setOpcion(TipoVisible.VISIBLE);
        //TODO acreedorPickList = AcreedorMapper.findByFilter(filtroPick);
        if (acreedorPickList.size() == 0) {
            addMessage(noRecordFoundMsg, FacesMessage.SEVERITY_INFO);
        }
    }

    public void deleteDetailAction(ActionEvent actionEvent) {
        nuevoRegistro.getAcreedores().remove(nuevoRegistroDetalle);
    }


    public void findRegistros() {
        //filtroBusqueda.setUsuarioId(getUser().getUsuarioId());
        registros = agrupacionAcreedorMapper.findByGrupoEmpresarialId(filtroBusqueda);
        detalle = new ArrayList<AcreedorDTO>();
        if (registros.size() == 0) {
            addMessage(noRecordFoundMsg, FacesMessage.SEVERITY_INFO);
        }
    }


    @Override
    public void onClean(ActionEvent actionEvent) {
        registros = new ArrayList<AgrupacionAcreedorDTO>();
        nuevoRegistro = new AgrupacionAcreedorDTO();
        filtroBusqueda = new AgrupacionAcreedorDTO();
    }


    public void onSelectDetail(SelectEvent actionEvent) {
        //TODO detalle = cuentaContableMapper.findByAgrupacionId(nuevoRegistro.getAgrupacionId());
    }

    @Override
    public void onPersist(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getClientId();
        if ("cmdGuardarTp".equals(idComponente)) {
            //TODO nuevoRegistro.asignarTasaProvision();
        } else {
            AgrupacionAcreedor agrupacionAcreedor = mapperService.map(nuevoRegistro, AgrupacionAcreedor.class);
            //agrupacion.setUsuarioId(getUser().getUsuarioId());
            registroAgrupacionAcreedorApp.save(agrupacionAcreedor, updateMode);
            findRegistros();
        }
    }

    public boolean isSelectRow() {
        for (AgrupacionAcreedorDTO agrupacionAcreedorDTO : registros) {
            if (agrupacionAcreedorDTO.isSeleccionado()) {
                return true;
            }
        }
        return false;
    }

    @Override
    protected void onDeleteSelect(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getClientId();

        if (idComponente.contains("cmdEliminarCuenta")) {
            List<AcreedorDTO> list = nuevoRegistro.getAcreedores();
            List<AcreedorDTO> remove = new ArrayList<AcreedorDTO>();
            for (AcreedorDTO acreedorDTO : list) {
                if (acreedorDTO.isSeleccionado()) {
                    remove.add(acreedorDTO);
                }
            }
            list.removeAll(remove);
            return;
        }


        for (AgrupacionAcreedorDTO agrupacionAcreedorDTO : registros) {
            if (agrupacionAcreedorDTO.isSeleccionado()) {
                AgrupacionAcreedor agrupacionAcreedor = mapperService.map(agrupacionAcreedorDTO, AgrupacionAcreedor.class);
                registroAgrupacionAcreedorApp.delete(agrupacionAcreedor);
            }
        }
        registroCheckPointApp.updateCheckPoints(getUser().getUsuarioId());
        detalle = new ArrayList<AcreedorDTO>();

    }

    @Override
    public void onDelete(ActionEvent actionEvent) {
        AgrupacionAcreedor agrupacionAcreedor = mapperService.map(nuevoRegistro, AgrupacionAcreedor.class);
        registroAgrupacionAcreedorApp.delete(agrupacionAcreedor);
        detalle = new ArrayList<AcreedorDTO>();
    }

    @Override
    protected void onDialogClose(CloseEvent event) {

    }

    @Override
    protected void onSelectAll(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getId();

        if ("cmdSelectAgrupacion".equals(idComponente)) {
            for (AgrupacionAcreedorDTO agrupacionAcreedorDTO : registros) {
                agrupacionAcreedorDTO.setSeleccionado(Boolean.TRUE);
            }
        } else if ("cmdSelectCuenta".equals(idComponente)) {
            for (AcreedorDTO acreedorDTO : nuevoRegistro.getAcreedores()) {
                acreedorDTO.setSeleccionado(Boolean.TRUE);
            }
        }
    }

    @Override
    protected void onUnSelectAll(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getId();
        if ("cmdUnSelectAgrupacion".equals(idComponente)) {
            for (AgrupacionAcreedorDTO agrupacionAcreedorDTO : registros) {
                agrupacionAcreedorDTO.setSeleccionado(Boolean.FALSE);
            }
        } else if ("cmdUnSelectCuenta".equals(idComponente)) {
            for (AcreedorDTO acreedorDTO : nuevoRegistro.getAcreedores()) {
                acreedorDTO.setSeleccionado(Boolean.FALSE);
            }
        }
    }

    /*Getters and Setters*/


    public boolean isStateMode() {
        return stateMode;
    }

    public void setStateMode(boolean stateMode) {
        this.stateMode = stateMode;
    }

    public AgrupacionAcreedorDTO getFiltroBusqueda() {
        return filtroBusqueda;
    }

    public void setFiltroBusqueda(AgrupacionAcreedorDTO filtroBusqueda) {
        this.filtroBusqueda = filtroBusqueda;
    }

    public AgrupacionAcreedorDTO getNuevoRegistro() {
        return nuevoRegistro;
    }

    public void setNuevoRegistro(AgrupacionAcreedorDTO nuevoRegistro) {
        this.nuevoRegistro = nuevoRegistro;
    }


    public List<AcreedorDTO> getDetalle() {
        return detalle;
    }

    public void setDetalle(List<AcreedorDTO> detalle) {
        this.detalle = detalle;
    }

    public List<AgrupacionAcreedorDTO> getRegistros() {
        return registros;
    }

    public void setRegistros(List<AgrupacionAcreedorDTO> registros) {
        this.registros = registros;
    }
          /*
    public List<AcreedorDTO> getCuentasPickList() {
        return cuentasPickList;
    }

    public void setCuentasPickList(List<AcreedorDTO> cuentasPickList) {
        this.cuentasPickList = cuentasPickList;
    }
             */
    public AcreedorFlt getFiltroPick() {
        return filtroPick;
    }

    public void setFiltroPick(AcreedorFlt filtroPick) {
        this.filtroPick = filtroPick;
    }

    public TipoCuenta[] getAllTipoCuenta() {
        TipoCuenta[] result = new TipoCuenta[2];
        result[0] = TipoCuenta.CUENTA_X_COBRAR;
        result[1] = TipoCuenta.CUENTA_X_PAGAR;
        return result;

    }

    public ActivoInactivo[] getAllEstado() {
        return ActivoInactivo.values();
    }

    public TipoSigno[] getAllSigno() {
        return TipoSigno.values();
    }

    public AcreedorDTO getNuevoRegistroDetalle() {
        return nuevoRegistroDetalle;
    }

    public void setNuevoRegistroDetalle(AcreedorDTO nuevoRegistroDetalle) {
        this.nuevoRegistroDetalle = nuevoRegistroDetalle;
    }
                     /*
    public TasaProvisionDTO getNuevaTasaProvision() {
        return nuevaTasaProvision;
    }

    public void setNuevaTasaProvision(TasaProvisionDTO nuevaTasaProvision) {
        this.nuevaTasaProvision = nuevaTasaProvision;
    }
    */
}
